#include "Personne.hpp"

#include <iostream>
#include <cstring> // pour la definition de NULL
                   // + fonctions strlen() et strcpy()

Personne::Personne(void) {
    std::cout << "constructeur 1 de la classe Personne " << std::endl;
    this->nom = NULL;
    this->adresse = NULL;
}

Personne::Personne(const char* var_name, const char* var_adress) {
    std::cout << "constructeur 2 de la classe Personne ";
    std::cout << "pour la personne [" << var_name << "]" << std::endl;
    this->nom = NULL;
    this->adresse = NULL;
    this->setNom(var_name);
    this->setAdresse(var_adress);
}

Personne::Personne(const Personne &Pers) {
    std::cout << "constructeur 3 de la classe Personne ";
    std::cout << "pour la personne [" << Pers.nom << "]" << std::endl;
    this->nom = NULL;
    this->adresse = NULL;
    this->setNom(Pers.nom);
    this->setAdresse(Pers.adresse);
}

Personne::~Personne(void) {
    if(this->nom != NULL) {
        std::cout << "destructeur de la classe Personne pour la personne " << std::endl;
        std::cout << "|" << this->nom << "|" << std::endl;
    }
    else {
        std::cout << "destructeur de la classe Personne " << std::endl;
    }

    delete[] this->nom;
    this->nom = NULL;
    delete[] this->adresse;
    this->adresse = NULL;
}

const char* Personne::getNom(void) const {
    return this->nom;
}

const char* Personne::getAdresse(void) const {
    return this->adresse;
}

void Personne::setNom(const char* val_name) {
    delete[] this->nom;
    this->nom = NULL;

    if(val_name != 0) { // on teste si val_name n'est pas une chaine vide,
        // si val_name est une chaine vide (val_name==0)
        // => on ne fait pas d'allocation
        
        this->nom = new char[strlen(val_name)];
        strcpy(this->nom, val_name);
    }
}

void Personne::setAdresse(const char* val_adress) {
    delete[] this->adresse;

    if(val_adress != 0) { // on teste si val_adress n'est pas une chaine vide,
        // si val_adress est une chaine vide (val_name==0)
        // => on ne fait pas d'allocation
        
        this->adresse = new char[strlen(val_adress)];
        strcpy(this->adresse, val_adress);
    }
}

void Personne::printInfo(void) {
    if(this->nom != 0) {
        std::cout << "Nom : " << this->nom << std::endl;
    } else {
        std::cout << "Nom non defini: " << std::endl;
    }

    if(this->adresse != 0) {
        std::cout << "Adresse : " << this->adresse << std::endl;
    } else {
        std::cout << "Adresse non definie: " << std::endl;
    }
}
